/**
 * mqtt-adapter.js
 *
 * 这个适配器处理MQTT包的条件导入，允许应用在开发和生产环境中都能工作。
 * 在生产环境中，我们依赖于与应用程序打包的MQTT。
 * 如果MQTT包不可用，将提供一个虚拟实现。
 */

// 声明MQTT变量
let mqtt;

// 尝试导入MQTT包
try {
  mqtt = await import('mqtt').then(m => m.default);
  console.log('[MQTT Adapter] 成功加载MQTT包');
} catch (e) {
  console.log('[MQTT Adapter] 加载MQTT失败，创建虚拟MQTT客户端:', e);

  // 创建一个虚拟的MQTT客户端
  const eventCallbacks = {};

  // 创建虚拟MQTT对象
  mqtt = {
    connect: (brokerUrl, options) => {
      console.log(`[MQTT Adapter] 虚拟连接到: ${brokerUrl}`);
      console.log(`[MQTT Adapter] 选项: ${JSON.stringify(options)}`);

      return {
        on: (event, callback) => {
          console.log(`[MQTT Adapter] 注册事件: ${event}`);
          if (!eventCallbacks[event]) {
            eventCallbacks[event] = [];
          }
          eventCallbacks[event].push(callback);

          // 如果是连接事件，立即触发
          if (event === 'connect') {
            setTimeout(() => callback(), 100);
          }
        },

        publish: (topic, message, options, callback) => {
          console.log(`[MQTT Adapter] 发布消息到 ${topic}: ${message}`);
          if (callback) {
            callback(null);
          }
        },

        subscribe: (topic, options, callback) => {
          console.log(`[MQTT Adapter] 订阅主题: ${topic}`);
          if (callback) {
            callback(null, { [topic]: { qos: 0 } });
          }
        },

        unsubscribe: (topic, callback) => {
          console.log(`[MQTT Adapter] 取消订阅主题: ${topic}`);
          if (callback) {
            callback(null);
          }
        },

        end: (force, callback) => {
          console.log('[MQTT Adapter] 关闭连接');
          if (callback) {
            callback(null);
          }
        },

        // 添加手动触发消息的方法，用于测试
        _triggerMessage: (topic, message) => {
          console.log(`[MQTT Adapter] 手动触发消息: ${topic}`);
          if (eventCallbacks['message']) {
            eventCallbacks['message'].forEach(cb => cb(topic, Buffer.from(message)));
          }
        }
      };
    }
  };
}

// 导出MQTT对象，无论是真实还是虚拟的
export { mqtt };